package innerclassdemo;

class OuterClass{
    /**
     * 普通成员变量  也就是实例成员变量
     */
    public int data1 = 10;
    private int data2 = 20;
    public static int data3 = 30;

    /**
     * 实力内部类：
     * 1.如何实例化内部类对象？
     *      外部类名.内部类名 变量 = 外部类对象的引用.new InnerClass();
     * 2.实例化内部类当中不能定义静态的成员变量？
     *      但是要定义必须是编译的时候确定的值(必须是static final的)
     *      public static final int date1 = 60;
     *      常量-》在编译的时候就确定这个值是几了
     * 3.实力内部类当中，如果有成员变量和外部类的成员变量重名了怎么办？
     *      优先使用自己的
     *      如何拿到外部类的？
     *              System.out.printLn("&&&&&&"+OuterClass.this.data1);
     *              实例化内部类当中 不仅包含了自己的this 而且包含了外部类的this
     * 4.不能包含静态方法
     */
    class InnerClass{
        public int data1 = 1000;
        public int data4 = 40;
        private int data5 = 50;
        public static final int data6 = 60;

        public InnerClass() {
            System.out.println("内部类的构造方法");
        }

        public void method(){
            System.out.println("=>>>" + OuterClass.this.data1);
            System.out.println(data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
            System.out.println("InnerClass的一个method方法！");
        }
    }
    public void methodOut(){
        //static final int c = 29;//erro
        InnerClass innerClass = new InnerClass();
        System.out.println(innerClass.data1);
        System.out.println(InnerClass.data6);
    }
}

public class TestDemo {
    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        outerClass.methodOut();

        System.out.println("============");
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
        innerClass.method();
    }

    public static void main1(String[] args) {
        OuterClass outerClass = new OuterClass();
        System.out.println(outerClass.data1);

        OuterClass.InnerClass innerClass = new OuterClass().new InnerClass();
        //new OuterClass():匿名对象：一般使用在 只用1次的时候
        System.out.println(new OuterClass().data1);

    }
}
